AvgPoolingGrad
根据输入梯度对平均池化前的特征图计算反向传播梯度。
\[output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w}\]其中 \((y_h, y_w)\) 与 \((x_h, x_w)\) 之间满足窗口与步长的映射关系。
- 输入:
input - 反向传播输入梯度张量首地址。
output - 反向传播输出梯度张量首地址。
batch - 批大小。
output_h - 池化输出高度。
output_w - 池化输出宽度。
channel - 通道数。
input_w - 池化输入宽度。
input_h - 池化输入高度。
stride_w - 水平步长。
stride_h - 垂直步长。
pad_l - 左侧填充大小。
pad_u - 上侧填充大小。
window_w - 池化窗口宽度。
window_h - 池化窗口高度。
core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
output - 原地累加平均池化反向传播梯度。
- 支持平台:
FT78NEMT7004备注
FT78NE 支持 fp32 数据类型。
MT7004 支持 fp16、fp32 数据类型。
共享存储版本:
-
void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
-
void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
C调用示例:
1// FT78NE 多核示例 2#include <stdio.h> 3 4int main(void) { 5 const float *input = (const float *)0xA0000000; // DDR 存储 6 float *output = (float *)0xB0000000; 7 int batch = 16; 8 int output_h = 7; 9 int output_w = 7; 10 int channel = 64; 11 int input_w = 14; 12 int input_h = 14; 13 int stride_w = 2; 14 int stride_h = 2; 15 int pad_l = 0; 16 int pad_u = 0; 17 int window_w = 2; 18 int window_h = 2; 19 int core_mask = 0xff; 20 fp_avgpoolinggrad_s(input, output, batch, output_h, output_w, 21 channel, input_w, input_h, 22 stride_w, stride_h, 23 pad_l, pad_u, 24 window_w, window_h, 25 core_mask); 26 return 0; 27}
私有存储版本:
-
void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
-
void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
C调用示例:
1// MT7004 单核示例 2#include <stdio.h> 3 4int main(void) { 5 const half *input = (const half *)0x10000000; // L2 存储 6 half *output = (half *)0x10004000; 7 int batch = 4; 8 int output_h = 4; 9 int output_w = 4; 10 int channel = 128; 11 int input_w = 8; 12 int input_h = 8; 13 int stride_w = 2; 14 int stride_h = 2; 15 int pad_l = 0; 16 int pad_u = 0; 17 int window_w = 2; 18 int window_h = 2; 19 int start_idx = 0; 20 int end_idx = batch * output_h * output_w * channel; 21 hp_avgpoolinggrad_p(input, output, batch, output_h, output_w, 22 channel, input_w, input_h, 23 stride_w, stride_h, 24 pad_l, pad_u, 25 window_w, window_h, 26 start_idx, end_idx); 27 return 0; 28}